package com.company.mapper;

import com.company.pojo.Teacher;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper // 告诉 Spring：这是一个 MyBatis中的 Mapper接口，在程序启动时框架会自动生成接口的实现类对象(代理对象)，并交给 Spring的 IOC容器管理
public interface TeacherMapper {
    /*
    * @Select注解就是用于执行的是 MySQL中的 Select语句，其返回值会被 mybatis自动返回到方法的返回值中
    * 查询到的每一条数据会被封装成一个指定对象，因此如果有多条查询数据，那么就会封装到一个指定对象类型的集合中
    * */
    // @Select("select teach_id, teach_name, password, degree, major from teachers")
    List<Teacher> searchInfo();

    /*
    * @Insert注解：用于在 Mapper 接口方法里绑定 insert 语句，配合 #{} 占位避免注入。其返回值会被 mybatis自动返回到方法的返回值中
    * 如果在 SQL语句中，我们需要传递 很多个参数 ，我们可以把多个参数封装到一个对象中，然后在调用方式设置传入的对象属性值即可。
    * 如果传递的参数量叫少，那么必须使用 @Param注解，为每个参数起别名，供 SQL 语句中使用 #{别名} 占位绑定。否则 MyBatis 无法区分哪个参数对应哪个。
    * 需要注意的是，#{} 中的名字并不是随便写的，而是必须和对象类中的属性名保持一致！
    * 例如对象类中的性别属性名为 teach_gender，那么在SQL语句的占位符中，就必须使用 #{teach_gender}
    * */
    @Insert("insert into teachers(teach_id, teach_name, gender, image, phone, degree, major, entry_date, teach_rank) " +
            "values(#{teach_id}, #{teach_name}, #{teach_gender}, #{teach_img}, #{teach_phone}, #{degree}, #{major}, #{teach_entryDate}, #{teach_rank})")
    Integer InsertInfo(Teacher teacher);

    /*
    * 批量添加数据：使用 "@Insert + @Param + MyBatis 的 <foreach>"
    * <script>...</script>标签用于告诉程序，这是动态 SQL，需要解析内部标签 <foreach>...</foreach>
    *<foreach> 标签的属性
    * collection：绑定方法参数 @Param("teacher") List<Teacher> teachers。
    * item：每次循环时，item 的值表示当前的对象。
    * separator=','：各条 VALUES 之间用逗号分隔，形成一条合法的批量插入语句。
    * #{u.属性}：程序在运行时会从 Teacher t 对象里取值并安全地替换到 SQL 中，自动防止 SQL 注入。
    *
    * 注意事项：
    * 1、需要添加注释：language=MyBatis，告诉 idea，<script>是 Mybatis的动态标签（也可以设置全局 SQL Dialect为 MyBatis解决报错问题）
    * 2、<foreach>标签的属性之间用空格分割，不能用逗号。并且属性值需要用转义的双引号（ \" ）
    * 3、占位符中的命名必须与对象的属性名保持一致！
    * */
    // language=MyBatis
    @Insert({
            "<script>",
            "insert into teachers(teach_id, teach_name, gender, image, phone, degree, major, entry_date, teach_rank) values ",
            "<foreach collection = \"teachers\" item = \"teacher\" separator = \",\">",
            "(#{teacher.teach_id}, #{teacher.teach_name}, #{teacher.teach_gender}, #{teacher.teach_img}, " +
                    "#{teacher.teach_phone}, #{teacher.degree}, #{teacher.major}, #{teacher.teach_entryDate}, #{teacher.teach_rank})",
            "</foreach>",
            "</script>"})
    Integer batchInsertInfo(@Param("teachers") List<Teacher> teachers);
}
